import json
import openai
import os
from utils.config_utils import load_config
from openai import OpenAI
import requests

def get_model_name_from_config_file(config_file='config.json'):
    config = load_config(config_file)
    if config :
        print('model : ', config.get('model', 'gpt-4'))
        return config.get('model', 'gpt-4')
    else:
        print('fial to load config file.')
    return None


def call_gpt4_api(prompt, api_key):
    """
    调用 GPT-4 接口

    参数:
    prompt (str): 提示词
    api_key (str): OpenAI API 密钥

    返回:
    str: 模型响应
    """
    openai.api_key = api_key
    response = openai.Completion.create(
        model="gpt-4",
        prompt=prompt,
        max_tokens=150  # 你可以根据需要调整这个值
    )
    return response.choices[0].text.strip()

def call_gpt3_api(prompt, api_key):
    """
    调用 GPT-3 接口

    参数:
    prompt (str): 提示词
    api_key (str): OpenAI API 密钥

    返回:
    str: 模型响应
    """
    openai.api_key = api_key
    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=prompt,
        max_tokens=150  # 你可以根据需要调整这个值
    )
    return response.choices[0].text.strip()

def call_kimi_api(prompt, api_key):
    client = OpenAI(
        api_key = api_key,
        base_url = "https://api.moonshot.cn/v1",
    )
    
    completion = client.chat.completions.create(
        model = "moonshot-v1-32k",
        messages = [
            {"role": "system", "content": "你是 Kimi，由 Moonshot AI 提供的人工智能助手，你更擅长中文和英文的对话。你会为用户提供安全，有帮助，准确的回答。同时，你会拒绝一切涉及恐怖主义，种族歧视，黄色暴力等问题的回答。Moonshot AI 为专有名词，不可翻译成其他语言。"},
            {"role": "user", "content": prompt}
        ],
        temperature = 0.4,
    )
    
    print(completion.choices[0].message.content)

    #return response


#### 文心一言 #########
def get_access_token():
    """
    使用 AK，SK 生成鉴权签名（Access Token）
    :return: access_token，或是None(如果错误)
    """
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": "nvGlKBt9yyh0kUMTQWVdArSR", "client_secret": "FJRNLCUDcHuOCoUz2qGEzyhgxC74mrNZ"}
    return str(requests.post(url, params=params).json().get("access_token"))



def call_baidu_api(prompt, api_key):
        
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + get_access_token()
    
    payload = json.dumps({
        "messages": [
            {
                "role": "user",
                "content": prompt,
            }
        ],
        "temperature": 0.95,
        "top_p": 0.8,
        "penalty_score": 1,
        "disable_search": True,
        "stream":False,
        "enable_citation": False,
        "max_output_tokens": 100
    })
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload)
    
    #print(response.json()["result"])
    return response.json()["result"]


def call_baidu_api_without_limit(prompt):
        
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + get_access_token()
    
    payload = json.dumps({
        "messages": [
            {
                "role": "user",
                "content": prompt,
            }
        ],
        "temperature": 0.95,
        "top_p": 0.8,
        "penalty_score": 1,
        "disable_search": True,
        "stream":False,
        "enable_citation": False,
        "max_output_tokens": 2000
    })
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload)
    
    #print(response.json()["result"])
    return response.json()["result"]


###########电信的作文批改接口################
def call_dianxin_api(problem, content, task='cn'):
    '''
    problem: 作文题目
    content:识别出来的作文内容
    task: 语文：cn;英语应用文：en-app；英语读后续写：en-con
    '''
        
    url = "https://1.194.160.84:7252/ai/bot/paper/predict"
    
    payload = json.dumps({
        "apiKey":"hfs-gs-app",
        "secretKey":"oTiWoiiuO098kjidfjie908iyieeS",
        "task":task,
        "problem":problem,
        "content":content
    })
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload, verify=False)

    if response.status_code != 200:
        print("Error: ", response.status_code)
        return None
    
    #print(response.json()["result"])
    return response.json()["result"]

def call_model_api(model, prompt, api_key):
    """
    根据配置文件中的模型名称调用相应的模型接口

    参数:
    model (str): 模型名称
    prompt (str): 提示词
    api_key (str): OpenAI API 密钥

    返回:
    str: 模型响应
    """
    if model == 'gpt-3':
        return call_gpt3_api(prompt, api_key)
    elif model == 'gpt-4':
        return call_gpt4_api(prompt, api_key)
    elif model == 'kimi':
        return call_kimi_api(prompt, api_key)
    elif model == 'baidu':
        return call_baidu_api(prompt, api_key)
    else:
        raise ValueError(f"Unsupported model: {model}")

# 示例用法
if __name__ == "__main__":
    # # 读取配置文件中的模型名称
    # model_name = get_model_name_from_config_file()
    # # 模拟提示词
    # prompt = "请按照【评分标准】对于【作文】进行打分: 【评分标准】 # 请从内容和主题、组织和结构、语言和风格、创新和独特性四个方面对以下作文进行评分和批改。 ## 内容和主题，该项满分15分。主要考察内容是否饱满充实，立意是否鲜明正确。 ## 组织和结构，该项满分15分。主要考察作文结构是否合理，文章组织是否得当。 ## 语言和风格，该项满分15分。主要考察作文的语言描述是否优美、通顺，文章风格是否体现出明显的特点。 ## 创新和独特，该项满分15分。主要考察作文整体表现是否具有创新性、题材新颖。 ## 请把每一项单独打分，最后输出各项汇总后的总得分。 【作文】 持美育之楫,创教育新风——让教育如沐春风 前不久教育部发布的通知,真 真正正的将“美育”一词推向大众, 其实美育的推行,正是教育界对教 育问题的重新认识。无论是98分遭 批评,还是体罚才是良法的众多现 象,都在被淘汰、被时代趋逐,转 而的“美育浸润”才是择优录取的 结果,所以,让教育如沐春风,是 当今社会不可或缺的。 我见青山多妩媚,料青山见我 应如是。美育的真正落实具有双重 效益。 ▲200当我们把美育落实到学生团体, 他们回馈的将会是一个优秀的团体。 诚然,我不否认曾经时代教育下仍 然人才辈出,但请相信,美育之下 的人们,更加具备担负世界的勇力。 因为从某种意义上来说,国家不需 要拒绝楚国相位而垂钓于濮水之上 的庄周,不需要厌恶官场而投身星 请在各题目的答题区域内作答,超出黑色矩形边框限定区域的答案无效 丽芳 请在各题目的答题区域内作答,超出黑色矩形边框限定区域的答案无效 夜田野的陶潜,它更需要敢于建言 献策并为国奔走的仲尼,更需要鞠 躬尽库死而后已的诸葛武侯。而这 后一类人,多是美育浸润下的结果, 正是美育的浸润,他们才多了为国 ▲400为民的勇力。 俱怀逸兴壮思飞,欲上青天揽 明月。美育的达成需要循序渐进, 时刻践行。 有人曾评价过我国的国学大师 叶嘉莹女士:“叶先生谈吐温和,待 人友善,在轻言细语中传达她深厚 的学识。”这不正是美育的体现吗? 以温和良善的态度,指导学子们在 学习的道路上不断探索,最终修成 垂天之羽、飞天之楫。同样的在学 校中,同样的美育浸润,我们不必 追求片刻出奇迹,一鸣惊人,相信 ▲600“随风潜入夜,润物细无声”,相信 积土成山,风雨兴焉。你且看,看 美育浸润颇久的学生,那将会是别 样风采。 海压竹枝低复举,风吹山角晦 请在各题目的答题区域内作答,超出黑色矩形边框限定区域的答案无效 丁丽芳 请在各题目的答题区域内作答,超出黑色矩形边框限定区域的答案无效 还明。美育的实践要处处落实。 也许有的人会以一切外在因素 来推辞美育,但这实在是不正确的, 纵无千里原野,应持骏马姿态。我 们可能缺少一定的经济基础,物质 支持,但作为教育者,作为施教方, 理应俱怀美育之心,在艰苦的环境 中落实美育,让教育如沐春风,从 来不是说说而已。 ▲800持美育之楫,创时代教育新风, 让教育如沐春风,让美育学子遍布 寰宇,让世界繁花盛开、阳光高照, 这是未来,但未来已来。 【输出】只需要输出一个json字符串，有5个字段，分别为：score0对应内容和主题的得分；score1对应组织和结构的得分；score2对应语言和风格的得分；score3对应创新和独特的得分；score4对用总评分。前四个分数的和必须和最后的总评分一样。"
    # # 你的 OpenAI API 密钥
    # api_key = "sk-xqPvIrQSosKdZrGzOGXj2c1PwHdMVDbuQAYUzMG36V81NXTq"  # 确保在实际使用中安全存储和加载你的 API 密钥
    # # 调用相应模型的接口
    # response = call_model_api(model_name, prompt, api_key)
    # print(response)

    # problem = '阅读下面的材料，根据要求写作。(60分)23.胡安焉在北京送快递时，每晚下班后，都会关掉手机，独自在宿舍楼的杂物间待两个小时。没有同事间吆喝的牌局，也没有手游网剧的干扰，他就着昏暗的灯光，读完了《尤利西斯》《没有个性的人》《审判》等大部头的著作。多年后，胡安焉成为一位畅销书作家，而当初寝室里消遣的同事，依然在快递站点起早贪黑地工作。当今时代，获得快乐的方式层出不穷，但追求怎样的快乐，拉开了人与人之间的差距。要求:综合材料内容及含意，选好角度，确定立意，明确文体，自拟标题，不要套作不得抄装，不得泄露个人信息:不少于800字'
    # content = '"弃纵情之兴,择梦想之乐\n流光一瞬,华表千年。随着科技发展日新月异,人们取乐的方式也在不停更新迭代。有些人贪恋多巴腰带来的一时快感,于灯红酒绿中纵情声色,干觥筹交错中迷失自我,变为欲望的奴隶。而像胡安焉为代表的另一类人,能放弃纵情声色的低级之兴,选择追球梦想的高级之乐因着终点的花团锦簇,追求道路上的苦便也酿成了蜜。以我所见:唯弃纵情的低级之兴,择梦想的高级之乐,并为之奋斗拼搏,方能行稳致远,抵达群星同一株树上开的两朵花,一朵坠于席上一朵落干茅房,从而形成了截然不同的两种命运。人亦是如此,追求快乐的方式不同,命运规迹便也发生偏转。君且看,善弃市华繁华,投身戈壁黄沙樊锦诗无怨无悔守敦煌便为佳话;远去了金戈铁马,淡漠了碧血狂沙,李司令一生为民,亦为美谈。其二人舍弃一时的快乐,选择了更为遥远的满足在成就个人的同时,奉献社会,万古流言。反观因一时利益,权欲熏心,欺下媚上的严嵩之流则臭名昭著,遗臭万年。不争一时争百世。不于山腰迷雾遮眼,才能见证山顶天地,故吾侪要以更为长远的梦想克服延迟满足带来的焦躁,不安,奔向彼岸。“既然目标是地平线,就只顾风雨兼程。”若只做出选择而不勤自努历,只肯三天打渔,两天晒网,草草了事,无论方向多么正确,也只是徒劳择一事,终一生。袁隆平一生致力于水稻高产,方有金色的波浪在稻田中起俄伏,稻香下农民捧起的希望;钱学森于核事业奔走一生方有64年的一声巨响,和中国人民挺起的脊梁我们友怎能不为之动容?在无数前辈的羽翼臂弯下,我们不必担心头顶的天空,只需奉献脚下的土地,又如何能一味索取,尸位素餐?“且将新火轼新茶,诗酒趁年华。”身为生在红旗下,长在春风里的新一代表年青年,我们应舍弃低级趣味,选择于祖国建设中成就自我之乐,成为无愧于人民,无愧于时代的人。"'
    # task = 'cn'
    # print(call_dianxin_api(problem, content, task))

    prompt = '''我将会给你一个json字符串，里面有三个字段，请判断三个字段是否等同（若有latex公式需根据语义判断公式是否相同），若等同则返回{“result”:True}；若不等同，则返回{“result”:False，“same”：“xxx”}，其中“same”字段是三个字段中最符合语义的一份，并且融合了另外两份中可能是准确的内容。注意：> 1. 请直接返回我想要的结果，无需额外的解释；> 2. 若包含有理科的公式，则优先以Latex方式描述；\
> 3. 若某一部分内容GOT字段的是正确的，则优先选择GOT的该部分内容\
> 4. 若内容为客观题的选项，则GOT可能存在遗漏选项的情况，请注意根据另外两个字段来确定是否有遗漏\
> json字符串如下：{"got_ocr":"10. [湖南长沙雅礼中学 \\(2023 期\n中]如图, 单位圆上有两个动点\n \\(A, B\\), 当 \\(|O A-O B|\\) 取得最大值\n时, \\(|O A-O B|=\\)","mineru_ocr":"10.[湖南长沙雅礼中学 2023期中门如图，单位圆上有两个动点$A\\,,B$,，当$\\vert\\overrightarrow{O A}-\\overrightarrow{O B}\\vert$取得最 大值时，$|\\overrightarrow{O A}-\\overrightarrow{O B}|=$","qwen_ocr":"10. [湖南长沙雅礼中学 2023 期中] 如图，单位圆上有两个动点 A, B, 当 |OA - OB| 取得最大值时，|OA - OB| = ( )"}'''
    result = call_baidu_api(prompt, None)
    print("result: ", result)
